<?php
namespace app\job\service;

use Spatie\Browsershot\Browsershot;
use think\Service;

class GenerateChartJob extends Service
{
    /**
     * 生成图表HTML模板
     */
    public function generateChartHtml($data,$width,$height): string
    {
        $chartId = "chart_" . uniqid();
        $jsUrl = '../echarts.min.js';
        $html = <<<HTML
        <!DOCTYPE html>
        <html>
        <head>
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <script src="{$jsUrl}"></script>
            <style>body{margin:0;padding:0;}</style>
        </head>
        <body>
            <div id="{$chartId}" style="width:{$width}px;height:{$height}px;"></div>
            <script>
                // 初始化图表
                const chart = echarts.init(document.getElementById('{$chartId}'));
                // 设置配置项
                chart.setOption({$data})
            </script>
        </body>
        </html>
        HTML;
        return $this->saveChartImage($html,$width,$height);
    }

    /**
     * 保存图表图片到服务器
     */
    private function saveChartImage(string $htmlPath,$width,$height): string
    {
        $savePath = app()->getRootPath().'public'. '/charts_img/' . date('Ymd') . '/' . time() . uniqid() . ".png";
        $file_path  = dirname($savePath);
        folder_build($file_path);
        // 无头浏览器渲染
        Browsershot::html($htmlPath)
            ->setChromePath('/usr/bin/chromium-browser') // Chrome可执行文件路径
            ->setOption('args', [
                '--no-sandbox',
                '--disable-setuid-sandbox',
                '--allow-file-access-from-files', // 允许从文件访问其他文件
                '--disable-web-security', // 禁用跨域安全检查
                '--allow-file-access', // 允许文件访问
                '--no-default-browser-check',
                '--no-first-run',
                '--disable-cache'
            ])
            ->windowSize($width,$height) // 宽度
            ->hideBackground()
            ->setCustomTempPath('/home/www/tmp/chromium-browser')
            ->save($savePath);
        return $savePath;
    }
}
